package StringSecond.SwordOffer;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class LengthOfLongestSubstring1 {
    /**
     * 剑指 Offer II 017. 含有所有字符的最短字符串
     * 给定两个字符串 s 和 t 。返回 s 中包含 t 的所有字符的最短子字符串。如果 s 中不存在符合条件的子字符串，则返回空字符串 “” 。
     *
     * 如果 s 中存在多个符合条件的子字符串，返回任意一个。
     *
     * 注意： 对于 t 中重复字符，我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
     *
     * 示例 1：
     *
     * 输入：s = “ADOBECODEBANC”, t = “ABC”
     * 输出：“BANC”
     * 解释：最短子字符串 “BANC” 包含了字符串 t 的所有字符 ‘A’、‘B’、‘C’
     * 示例 2：
     *
     * 输入：s = “a”, t = “a”
     * 输出：“a”
     * 示例 3：
     *
     * 输入：s = “a”, t = “aa”
     * 输出：""
     */

    public static String minWindow(String s, String t) {
        int minLength = Integer.MAX_VALUE, start = 0, end = 0, minStart = 0, minEnd = 0;
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) + 1);
        }
        int count = map.size();
        while (end < s.length() || (count == 0 && end == s.length())) {
            if (count > 0) {
                char endCh = s.charAt(end);
                if (map.containsKey(endCh)) {
                    map.put(endCh, map.get(endCh) - 1);
                    if (map.get(endCh) == 0) count--;
                }
                end++;
            } else {
                if (end - start < minLength) {
                    minLength = end - start;
                    minStart = start;
                    minEnd = end;
                }
                char startCh = s.charAt(start);
                if (map.containsKey(startCh)) {
                    map.put(startCh, map.get(startCh) + 1);
                    if (map.get(startCh) == 1) count++;
                }
                start++;
            }
        }
        return minLength < Integer.MAX_VALUE ? s.substring(minStart, minEnd) : "";
    }

    public static void main(String[] args) {
        System.out.println(minWindow("ADOBECODEBANC", "ABC"));
    }
}
